# -*- coding: utf-8 -*-
"""
使用PCA降噪
Created on Thu Mar 29 20:27:36 2018

@author: Allen
"""
import numpy as np
import matplotlib.pyplot as plt

# 手写识别
from sklearn import datasets

digits = datasets.load_digits()
X = digits.data
y = digits.target

# 为 X 添加上噪音
noisy_digits = X + np.random.normal( 0, 4, size = X.shape )

# 从每一个数字中，抽取10个样本，组成一个新的样本集
example_digits = noisy_digits[y==0,:][:10]
for num in range( 1, 10 ):
    X_num = noisy_digits[y==num,:][:10]
    example_digits = np.vstack( ( example_digits, X_num ) )
    
print( example_digits.shape ) # (100, 64)

def plot_digits( data ):
    fig, axes = plt.subplots( 10, 10, figsize=( 10, 10 ),
                             subplot_kw={"xticks":[],"yticks":[]},
                             gridspec_kw = dict( hspace = 0.1, wspace = 0.1 )
                             )
    for i, ax in enumerate( axes.flat ):
        ax.imshow( data[i].reshape(8, 8), cmap="binary",interpolation="nearest",clim=(0,16) )

#plot_digits( example_digits )

from sklearn.decomposition import PCA
pca = PCA( 0.5 ) # 噪音比较大，只保留50%的信息
pca.fit( noisy_digits )
print( pca.n_components_ ) # 12
components = pca.transform( example_digits )
filtered_digits = pca.inverse_transform( components )
plot_digits( filtered_digits )

'''
总结：
    PCA 的作用不仅仅是降维，还有降噪的功能。
    在降维的过程中，将噪声去掉，可以使分类更清晰。
'''